package com.rbac.common.config;

import cn.dev33.satoken.stp.StpInterface;
import com.rbac.modules.system.entity.SysUser;
import com.rbac.modules.system.service.SysUserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 自定义权限验证接口扩展
 * 用于告诉 Sa-Token 框架如何获取用户的权限和角色信息
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class StpInterfaceImpl implements StpInterface {

    private final SysUserService userService;

    /**
     * 返回一个账号所拥有的权限码集合
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        try {
            // 从数据库获取用户权限列表
            SysUser user = getUserByLoginId(loginId);
            if (user != null) {
                List<String> permissions = userService.getUserPermissions(user.getId());
                log.info("获取到用户权限列表: {}", permissions);
                return permissions;
            }
            log.warn("未找到用户信息，登录ID: {}", loginId);
            return new ArrayList<>();
        } catch (Exception e) {
            log.error("获取用户权限列表时发生错误", e);
            return new ArrayList<>();
        }
    }

    /**
     * 返回一个账号所拥有的角色标识集合
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        try {
            // 从数据库获取用户角色列表
            SysUser user = getUserByLoginId(loginId);
            if (user != null) {
                List<String> roles = userService.getUserRoles(user.getId());
                log.info("获取到用户角色列表: {}", roles);
                return roles;
            }
            log.warn("未找到用户信息，登录ID: {}", loginId);
            return new ArrayList<>();
        } catch (Exception e) {
            log.error("获取用户角色列表时发生错误", e);
            return new ArrayList<>();
        }
    }

    /**
     * 根据登录ID获取用户信息
     * 支持数字ID和用户名两种方式
     */
    private SysUser getUserByLoginId(Object loginId) {
        if (loginId == null) {
            return null;
        }

        String loginIdStr = loginId.toString();
        try {
            // 尝试将登录ID转换为数字
            Long userId = Long.valueOf(loginIdStr);
            return userService.getById(userId);
        } catch (NumberFormatException e) {
            // 如果不是数字，则按用户名查询
            return userService.lambdaQuery()
                    .eq(SysUser::getUsername, loginIdStr)
                    .one();
        }
    }
}
